﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AllegroWebAPI.Utils;

namespace AllegroWebAPI
{
    /// <summary>
    /// Komentarze i ocena sprzedaży
    /// </summary>
    public class Feedback: BaseAllegroExt
    {
        /// <summary>
        /// Komentarze i ocena sprzedaży
        /// </summary>
        /// <param name="a"></param>
        public Feedback(AllegroClient a)
            : base(a)
        { 

        }



        public int Add(long itemId, int userId, string comment, CommentType commentType, List<SellRatingEstimationStruct> rating)
        {
            ItemCatList[] itemcatlist;
            ItemImageList[] itemimagelist;
            AttribStruct[] atribstruct;
            PostageStruct[] postagestruct;

            ItemPaymentOptions itemPaymentOptions;
            CompanyInfoStruct companyInfoStruct;
            ProductStruct productStruct;

            ItemInfoExt ret;
            ret = aapi.WebService.doShowItemInfoExt(aapi.SessionHandle, itemId, 
                                                     0, true,
                                                     0, true,
                                                     0, true,
                                                     0, true,
                                                     0, true,
                                                     0, true,
                                                     out itemcatlist,
                                                     out itemimagelist,
                                                     out atribstruct,
                                                     out postagestruct,
                                                     out itemPaymentOptions,
                                                     out companyInfoStruct,
                                                     out productStruct);

            string ct = commentType.ToString().Substring(0, 3).ToUpper();
            return aapi.WebService.doFeedback(aapi.SessionHandle, itemId, 0, userId, comment, ct, (ret.itSellerId == (long)userId ? 1 : 0), rating.ToArray());
        }

        public IEnumerable<SellRatingInfoStruct> GetSellRatingReason()
        {
            return aapi.WebService.doGetSellRatingReasons(aapi.WebApiKey, aapi.CountryId);
        }

        /// <summary>
        /// Metoda pozwala na pobranie informacji o komentarzach dowolnego użytkownika. Domyślnie zwracane są wszystkie komentarze (ew. ograniczone typem), posortowane malejąco po czasie ich dodania. Miejsce rozpoczęcia pobierania listy komentarzy pozwala regulować parametr feedback-offset. Należy podać identyfikator użytkownika tylko w jednym z parametrów: feedback-from lub feedback-to. W pierwszym - gdy pobrane mają zostać informacje o komentarzach, które wskazany użytkownik wystawił. W drugim - gdy pobrane mają zostać informacje o komentarzach, które wskazanemu użytkownikowi zostały wystawione.
        /// </summary>
        /// <param name="fromUserId"></param>
        /// <param name="toUserId"></param>
        /// <param name="offset"></param>
        /// <param name="commentType"></param>
        /// <param name="feedbackCount"></param>
        /// <returns></returns>
        public IEnumerable<FeedbackList> GetFeedback(long fromUserId, int toUserId, int offset, CommentTypeAll commentType, out int feedbackCount)
        {
            return aapi.WebService.doGetFeedback(aapi.SessionHandle, (int)fromUserId, toUserId, offset, commentType.ToString().Substring(0, 3).ToUpper(), out feedbackCount);
        }

        public IEnumerable<FeedbackList> GetFeedback(long userId, CommentTypeAll commentType)
        {
            int feedbackCount;
            return GetFeedback(0, (int)userId, 0, commentType, out feedbackCount);
        }

        public IEnumerable<FeedbackList> GetFeedbackGaved(int userId, CommentTypeAll commentType)
        { 
            int feedbackCount;
            return GetFeedback(userId, 0, 0, commentType, out feedbackCount);
        }

        /// <summary>
        /// Metoda pozwala na pobranie szczegółowych informacji na temat oceny sprzedaży zalogowanego użytkownika.
        /// </summary>
        /// <returns></returns>
        public SellRatingStruct GetMySellRating()
        {
            SellRatingAverageStruct[] sra;
            SellRatingDetailStruct[] srd;
            SellRatingAveragePerMonthStruct[] srm;
            SellRatingStruct r = new SellRatingStruct();

            r.TotalCount = aapi.WebService.doGetMySellRating(aapi.SessionHandle, out sra, out srd, out srm);

            r.SellRatingAverage = sra.ToList();
            r.SellRatingDetail = srd.ToList();
            r.SellRatingAveragePerMonth = srm.ToList();
            return r;
        }

        /// <summary>
        /// Metoda pozwala na pobranie informacji o komentarzach oczekujących na wystawienie przez zalogowanego użytkownika. Domyślnie zwracanych jest 25 elementów. Rozmiar porcji danych pozwala regulować parametr package-size, a sterowanie pobieraniem kolejnych porcji umożliwia parametr offset.
        /// </summary>
        /// <param name="offset"></param>
        /// <param name="packageSize"></param>
        /// <returns></returns>
        public IEnumerable<WaitFeedbackStruct> GetWaitingFeedbacks(int offset, int packageSize)
        {
            return aapi.WebService.doGetWaitingFeedbacks(aapi.SessionHandle, offset, packageSize);
        }

        public IEnumerable<WaitFeedbackStruct> GetWaitingFeedbacks()
        {
            return GetWaitingFeedbacks(0, 0);
        }

        /// <summary>
        /// Metoda pozwala na pobranie informacji o komentarzach zalogowanego użytkownika. Domyślnie zwracanych jest 25 ostatnich komentarzy (wystawionych lub otrzymanych), posortowanych malejąco po czasie ich dodania. Miejsce rozpoczęcia pobierania listy komentarzy pozwala regulować parametr offset. Jeżeli w wejściowej tablicy przekazane zostaną identyfikatory ofert, dla których nie zostały wystawione komentarze - identyfikatory te zostaną zignorowane, a informacje zwrócone zostaną tylko dla tych z podanych ofert, dla których jest taka możliwość.
        /// </summary>
        /// <param name="feedbackType"></param>
        /// <param name="offset"></param>
        /// <returns></returns>
        public IEnumerable<MyFeedbackListStruct2> MyFeedback2(FeedbackType feedbackType, int offset)
        {
            return aapi.WebService.doMyFeedback2(aapi.SessionHandle, feedbackType.ToString(), offset, 0, null);
        }



    }
}
